package org.pager.utils;

import java.io.IOException;
import java.io.InputStream;
import java.sql.*;
import java.util.Properties;


/**
 * 连接数据库 + 执行数据库操作 - 基于 Java 实现操作
 *
 * @author lrf
 * @date 2024-06-07
 */
public class DbUtils {

	private static String dbDriver;
	private static String dbUrl;
	private static String dbUser;
	private static String dbPwd;
	/**
	 * 连接对象
	 */
	private Connection conn;
	private PreparedStatement psmt;
	private ResultSet rs;

	/**
	 * 读取属性文件
	 */
	static {
		// 创建输入流
		InputStream in = DbUtils.class.getResourceAsStream("./jdbc.properties");
		// 创建属性类对象
		Properties pro = new Properties();
		try {
			// 从流中加载属性列表
			pro.load(in);
			// 读取属性
			dbDriver = pro.getProperty("jdbc.driver");
			dbUrl = pro.getProperty("jdbc.dbUrl");
			dbUser = pro.getProperty("jdbc.dbUser");
			dbPwd = pro.getProperty("jdbc.dbPwd");
			// 关闭流
			in.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	// 加载驱动
	static {
		try {
			Class.forName(dbDriver);
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
	}

	/**
	 * 创建数据库连接
	 * 
	 * @return 返回连接对象
	 */
	private Connection getConnection() {
		try {
			conn = DriverManager.getConnection(dbUrl, dbUser, dbPwd);
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return conn;
	}

	/**
	 * 增删改的通用方法
	 * 
	 * @param sql    增删改的sql语句
	 * @param params 参数值列表
	 * @return 返回受影响行数
	 * @throws SQLException 声明异常
	 */
	public int executeUpdate(String sql, Object... params) throws SQLException {
		conn = getConnection(); // 创建连接
		psmt = conn.prepareStatement(sql);
		// 指定参数值
		if (params != null) {
			for (int i = 0; i < params.length; i++) {
				psmt.setObject(i + 1, params[i]);
			}
		}
		// 执行
		int rows = psmt.executeUpdate();
		// 关闭对象
		closeAll();
		return rows;
	}

	/**
	 * 查询的通用方法
	 * @param sql  查询的sql语句
	 * @param params 参数值列表
	 * @return 返回结果集
	 * @throws SQLException 声明异常
	 */
	public ResultSet executeQuery(String sql, Object... params) throws SQLException {
		conn = getConnection();
		psmt = conn.prepareStatement(sql);
		// 指定参数值
		if (params != null) {
			for (int i = 0; i < params.length; i++) {
				psmt.setObject(i + 1, params[i]);
			}
		}
		// 执行
		rs = psmt.executeQuery();
		// 不能关闭对象
		return rs;
	}

	/**
	 * 关闭所有对象
	 */
	public void closeAll() {
		try {
			if (rs != null) {
				rs.close();
			}
			if (psmt != null) {
				psmt.close();
			}
			if (conn != null) {
				conn.close();
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}

	public static void main(String[] args) {
		System.out.println(new DbUtils().getConnection());
	}

}
